home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / Src / Ch17 / VBRay.frm < prev    next >
Text File  |  1999-07-10  |  29KB  |  870 lines

  1. VERSION 5.00
  2. Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "COMDLG32.OCX"
  3. Begin VB.Form frmVBRay 
  4.    Appearance      =   0  'Flat
  5.    Caption         =   "VBRay []"
  6.    ClientHeight    =   4215
  7.    ClientLeft      =   1830
  8.    ClientTop       =   1260
  9.    ClientWidth     =   9030
  10.    DrawMode        =   14  'Copy Pen
  11.    ForeColor       =   &H80000008&
  12.    LinkTopic       =   "Form1"
  13.    PaletteMode     =   1  'UseZOrder
  14.    ScaleHeight     =   4215
  15.    ScaleWidth      =   9030
  16.    Begin VB.PictureBox picTexture 
  17.       Height          =   375
  18.       Index           =   0
  19.       Left            =   2880
  20.       ScaleHeight     =   315
  21.       ScaleWidth      =   315
  22.       TabIndex        =   19
  23.       Top             =   1920
  24.       Visible         =   0   'False
  25.       Width           =   375
  26.    End
  27.    Begin VB.TextBox txtObjects 
  28.       BeginProperty Font 
  29.          Name            =   "Courier New"
  30.          Size            =   8.25
  31.          Charset         =   0
  32.          Weight          =   400
  33.          Underline       =   0   'False
  34.          Italic          =   0   'False
  35.          Strikethrough   =   0   'False
  36.       EndProperty
  37.       Height          =   1935
  38.       Left            =   0
  39.       MultiLine       =   -1  'True
  40.       ScrollBars      =   3  'Both
  41.       TabIndex        =   13
  42.       Text            =   "VBRay.frx":0000
  43.       Top             =   2280
  44.       Width           =   4395
  45.    End
  46.    Begin MSComDlg.CommonDialog dlgFile 
  47.       Left            =   2160
  48.       Top             =   1920
  49.       _ExtentX        =   847
  50.       _ExtentY        =   847
  51.       _Version        =   393216
  52.       CancelError     =   -1  'True
  53.    End
  54.    Begin VB.Frame Frame1 
  55.       Caption         =   "Rendering"
  56.       Height          =   1095
  57.       Index           =   2
  58.       Left            =   2520
  59.       TabIndex        =   9
  60.       Top             =   0
  61.       Width           =   1875
  62.       Begin VB.TextBox txtStep 
  63.          BeginProperty Font 
  64.             Name            =   "MS Sans Serif"
  65.             Size            =   8.25
  66.             Charset         =   0
  67.             Weight          =   700
  68.             Underline       =   0   'False
  69.             Italic          =   0   'False
  70.             Strikethrough   =   0   'False
  71.          EndProperty
  72.          Height          =   285
  73.          Left            =   840
  74.          TabIndex        =   11
  75.          Text            =   "4"
  76.          Top             =   240
  77.          Width           =   375
  78.       End
  79.       Begin VB.CommandButton cmdRender 
  80.          Caption         =   "Render"
  81.          Height          =   375
  82.          Left            =   480
  83.          TabIndex        =   10
  84.          Top             =   600
  85.          Width           =   855
  86.       End
  87.       Begin VB.Label Label1 
  88.          Caption         =   "Step"
  89.          Height          =   255
  90.          Index           =   13
  91.          Left            =   240
  92.          TabIndex        =   12
  93.          Top             =   240
  94.          Width           =   375
  95.       End
  96.    End
  97.    Begin VB.Frame Frame1 
  98.       Caption         =   "Display Method"
  99.       Height          =   1935
  100.       Index           =   1
  101.       Left            =   0
  102.       TabIndex        =   1
  103.       Top             =   0
  104.       Width           =   2475
  105.       Begin VB.OptionButton optMethod 
  106.          Caption         =   "Ray Tracing"
  107.          Height          =   255
  108.          Index           =   4
  109.          Left            =   240
  110.          TabIndex        =   8
  111.          Top             =   1200
  112.          Width           =   1215
  113.       End
  114.       Begin VB.OptionButton optMethod 
  115.          Caption         =   "Surface Shading"
  116.          Height          =   255
  117.          Index           =   3
  118.          Left            =   240
  119.          TabIndex        =   7
  120.          Top             =   960
  121.          Width           =   1695
  122.       End
  123.       Begin VB.OptionButton optMethod 
  124.          Caption         =   "Hidden Surface Removal"
  125.          Height          =   255
  126.          Index           =   2
  127.          Left            =   240
  128.          TabIndex        =   6
  129.          Top             =   720
  130.          Width           =   2145
  131.       End
  132.       Begin VB.OptionButton optMethod 
  133.          Caption         =   "Backface Removal"
  134.          Height          =   255
  135.          Index           =   1
  136.          Left            =   240
  137.          TabIndex        =   5
  138.          Top             =   480
  139.          Width           =   1695
  140.       End
  141.       Begin VB.OptionButton optMethod 
  142.          Caption         =   "Wire Frame"
  143.          Height          =   255
  144.          Index           =   0
  145.          Left            =   240
  146.          TabIndex        =   4
  147.          Top             =   240
  148.          Width           =   1215
  149.       End
  150.       Begin VB.TextBox txtDepth 
  151.          BeginProperty Font 
  152.             Name            =   "MS Sans Serif"
  153.             Size            =   8.25
  154.             Charset         =   0
  155.             Weight          =   700
  156.             Underline       =   0   'False
  157.             Italic          =   0   'False
  158.             Strikethrough   =   0   'False
  159.          EndProperty
  160.          Height          =   285
  161.          Left            =   1080
  162.          TabIndex        =   2
  163.          Text            =   "1"
  164.          Top             =   1560
  165.          Width           =   375
  166.       End
  167.       Begin VB.Label Label1 
  168.          Caption         =   "Depth"
  169.          Height          =   255
  170.          Index           =   3
  171.          Left            =   480
  172.          TabIndex        =   3
  173.          Top             =   1560
  174.          Width           =   495
  175.       End
  176.    End
  177.    Begin VB.PictureBox picCanvas 
  178.       AutoRedraw      =   -1  'True
  179.       BackColor       =   &H00FFFF80&
  180.       BeginProperty Font 
  181.          Name            =   "MS Sans Serif"
  182.          Size            =   8.25
  183.          Charset         =   0
  184.          Weight          =   700
  185.          Underline       =   0   'False
  186.          Italic          =   0   'False
  187.          Strikethrough   =   0   'False
  188.       EndProperty
  189.       Height          =   4215
  190.       Left            =   4440
  191.       ScaleHeight     =   277
  192.       ScaleMode       =   3  'Pixel
  193.       ScaleWidth      =   301
  194.       TabIndex        =   0
  195.       Top             =   0
  196.       Width           =   4575
  197.    End
  198.    Begin VB.Label Label1 
  199.       Caption         =   "Polygons"
  200.       Height          =   255
  201.       Index           =   1
  202.       Left            =   2520
  203.       TabIndex        =   18
  204.       Top             =   1560
  205.       Width           =   700
  206.    End
  207.    Begin VB.Label Label1 
  208.       Caption         =   "Time"
  209.       Height          =   255
  210.       Index           =   0
  211.       Left            =   2520
  212.       TabIndex        =   17
  213.       Top             =   1200
  214.       Width           =   615
  215.    End
  216.    Begin VB.Label lblPolygons 
  217.       BorderStyle     =   1  'Fixed Single
  218.       Height          =   255
  219.       Left            =   3240
  220.       TabIndex        =   16
  221.       Top             =   1560
  222.       Width           =   1095
  223.    End
  224.    Begin VB.Label lblTime 
  225.       BorderStyle     =   1  'Fixed Single
  226.       Height          =   255
  227.       Left            =   3240
  228.       TabIndex        =   15
  229.       Top             =   1200
  230.       Width           =   1095
  231.    End
  232.    Begin VB.Label Label1 
  233.       Caption         =   "Objects"
  234.       Height          =   255
  235.       Index           =   4
  236.       Left            =   0
  237.       TabIndex        =   14
  238.       Top             =   2040
  239.       Width           =   615
  240.    End
  241.    Begin VB.Menu mnuFile 
  242.       Caption         =   "&File"
  243.       Begin VB.Menu mnuFileOpenScene 
  244.          Caption         =   "&Open Scene..."
  245.          Shortcut        =   ^O
  246.       End
  247.       Begin VB.Menu mnuFileSaveScene 
  248.          Caption         =   "&Save Scene..."
  249.          Shortcut        =   ^S
  250.       End
  251.       Begin VB.Menu mnuFileNew 
  252.          Caption         =   "&New"
  253.          Shortcut        =   ^N
  254.       End
  255.       Begin VB.Menu mnuFileSaveSep 
  256.          Caption         =   "-"
  257.       End
  258.       Begin VB.Menu mnuFileSaveBitmap 
  259.          Caption         =   "Save Bitmap..."
  260.          Shortcut        =   ^B
  261.       End
  262.    End
  263.    Begin VB.Menu mnuObj 
  264.       Caption         =   "&Objects"
  265.       Begin VB.Menu mnuObjViewpoint 
  266.          Caption         =   "&Viewpoint"
  267.       End
  268.       Begin VB.Menu mnuObjAmbientLight 
  269.          Caption         =   "&Ambient Light"
  270.       End
  271.       Begin VB.Menu mnuObjLightSource 
  272.          Caption         =   "&Light Source"
  273.       End
  274.       Begin VB.Menu mnuObjSep 
  275.          Caption         =   "-"
  276.       End
  277.       Begin VB.Menu mnuObjNormal 
  278.          Caption         =   "&Normal Objects"
  279.          Begin VB.Menu mnuObjSphere 
  280.             Caption         =   "&Sphere"
  281.          End
  282.          Begin VB.Menu mnuObjPlane 
  283.             Caption         =   "&Plane"
  284.          End
  285.          Begin VB.Menu mnuObjDisk 
  286.             Caption         =   "&Disk"
  287.          End
  288.          Begin VB.Menu mnuObjPolygon 
  289.             Caption         =   "Poly&gon"
  290.          End
  291.          Begin VB.Menu mnuObjCylinder 
  292.             Caption         =   "&Cylinder"
  293.          End
  294.          Begin VB.Menu mnuObjCheckerboard 
  295.             Caption         =   "Checker&board"
  296.          End
  297.          Begin VB.Menu mnuObjFace 
  298.             Caption         =   "&Face"
  299.          End
  300.       End
  301.       Begin VB.Menu mnuObjTextured 
  302.          Caption         =   "&Textured Objects"
  303.          Begin VB.Menu mnuObjBumpyShere 
  304.             Caption         =   "&Bumpy Sphere"
  305.          End
  306.          Begin VB.Menu mnuObjMappedCheckerboard 
  307.             Caption         =   "Mapped &Checkerboard"
  308.          End
  309.          Begin VB.Menu mnuObjHoledCheckerboard 
  310.             Caption         =   "&Holed Checkerboard"
  311.          End
  312.       End
  313.    End
  314.    Begin VB.Menu mnuRender 
  315.       Caption         =   "&Render"
  316.       Begin VB.Menu mnuRenderRender 
  317.          Caption         =   "&Render"
  318.          Shortcut        =   {F5}
  319.       End
  320.    End
  321. End
  322. Attribute VB_Name = "frmVBRay"
  323. Attribute VB_GlobalNameSpace = False
  324. Attribute VB_Creatable = False
  325. Attribute VB_PredeclaredId = True
  326. Attribute VB_Exposed = False
  327. Option Explicit
  328.  
  329. Private Enum RenderingMethodTypes
  330.     render_WireFrame = 0
  331.     render_BackfacesRemoved = 1
  332.     render_HiddenSurfacesRemoved = 2
  333.     render_Shaded = 3
  334.     render_RayTracing = 4
  335. End Enum
  336.  
  337. Private RenderingMethod As RenderingMethodTypes
  338.  
  339. ' Create the objects in the scene.
  340. Private Sub CreateData()
  341. Dim all_objects As String
  342. Dim obj_type As String
  343. Dim obj_parameters As String
  344. Dim light_source As LightSource
  345. Dim Sphere As RaySphere
  346. Dim bumpy_sphere As RayBumpySphere
  347. Dim plane As RayPlane
  348. Dim disk As RayDisk
  349. Dim pgon As RayPolygon
  350. Dim checker As RayCheckerboard
  351. Dim cyl As RayCylinder
  352. Dim face As RayFace
  353. Dim textured_checker As RayMappedCheckerboard
  354. Dim holed_checker As RayHoledCheckerboard
  355.  
  356.     ' Initialize the ambient light.
  357.     AmbientIr = 0
  358.     AmbientIg = 0
  359.     AmbientIb = 0
  360.  
  361.     ' Initialize the eye position.
  362.     EyeR = 1000
  363.     EyeTheta = 1.3
  364.     EyePhi = -0.3
  365.  
  366.     ' Start with new collections.
  367.     Set Objects = New Collection
  368.     Set LightSources = New Collection
  369.  
  370.     ' Get the objects string. Remove comments and
  371.     ' non-printing characters. Trim.
  372.     all_objects = RemoveComments(txtObjects.Text)
  373.     all_objects = NonPrintingToSpace(all_objects)
  374.     all_objects = Trim$(all_objects)
  375.  
  376.     ' Parse the objects.
  377.     Do While Len(all_objects) > 0
  378.         obj_type = LCase$(GetDelimitedToken(all_objects, "("))
  379.         obj_parameters = GetDelimitedToken(all_objects, ")")
  380.  
  381.         Select Case obj_type
  382.             Case "viewpoint"
  383.                 ' Get the current eye location.
  384.                 EyeR = CSng(GetDelimitedToken(obj_parameters, ","))
  385.                 EyeTheta = CSng(GetDelimitedToken(obj_parameters, ","))
  386.                 EyePhi = CSng(obj_parameters)
  387.  
  388.             Case "ambientlight"
  389.                 ' Get the ambient light values.
  390.                 AmbientIr = CSng(GetDelimitedToken(obj_parameters, ","))
  391.                 AmbientIg = CSng(GetDelimitedToken(obj_parameters, ","))
  392.                 AmbientIb = CSng(obj_parameters)
  393.  
  394.             Case "lightsource"
  395.                 ' Make a lighht source.
  396.                 Set light_source = New LightSource
  397.                 light_source.SetParameters obj_parameters
  398.                 LightSources.Add light_source
  399.  
  400.             Case "sphere"
  401.                 ' Make a sphere.
  402.                 Set Sphere = New RaySphere
  403.                 Sphere.SetParameters obj_parameters
  404.                 Objects.Add Sphere
  405.  
  406.             Case "plane"
  407.                 ' Make a plane.
  408.                 Set plane = New RayPlane
  409.                 plane.SetParameters obj_parameters
  410.                 Objects.Add plane
  411.  
  412.             Case "disk"
  413.                 ' Make a disk.
  414.                 Set disk = New RayDisk
  415.                 disk.SetParameters obj_parameters
  416.                 Objects.Add disk
  417.  
  418.             Case "polygon"
  419.                 ' Make a polygon.
  420.                 Set pgon = New RayPolygon
  421.                 pgon.SetParameters obj_parameters
  422.                 Objects.Add pgon
  423.  
  424.             Case "checkerboard"
  425.                 Set checker = New RayCheckerboard
  426.                 checker.SetParameters obj_parameters
  427.                 Objects.Add checker
  428.  
  429.             Case "cylinder"
  430.                 Set cyl = New RayCylinder
  431.                 cyl.SetParameters obj_parameters
  432.                 Objects.Add cyl
  433.  
  434.             Case "face"
  435.                 Set face = New RayFace
  436.                 face.SetParameters obj_parameters
  437.                 Objects.Add face
  438.  
  439.             Case "bumpysphere"
  440.                 ' Make a bumy sphere.
  441.                 Set bumpy_sphere = New RayBumpySphere
  442.                 bumpy_sphere.SetParameters obj_parameters
  443.                 Objects.Add bumpy_sphere
  444.  
  445.             Case "mappedcheckerboard"
  446.                 Set textured_checker = New RayMappedCheckerboard
  447.                 Load picTexture(picTexture.UBound + 1)
  448.                 textured_checker.SetParameters picTexture(picTexture.UBound), obj_parameters
  449.                 Objects.Add textured_checker
  450.  
  451.             Case "holedcheckerboard"
  452.                 Set holed_checker = New RayHoledCheckerboard
  453.                 Load picTexture(picTexture.UBound + 1)
  454.                 holed_checker.SetParameters picTexture(picTexture.UBound), obj_parameters
  455.                 Objects.Add holed_checker
  456.  
  457.             Case Else
  458.                 MsgBox "Unknown object type " & obj_type
  459.         End Select
  460.     Loop
  461. End Sub
  462. ' Project and draw all the objects.
  463. Private Sub RenderObjects(ByVal pic As Object, ByVal lblPolygons As Label)
  464. Dim start_time As Single
  465. Dim ellapsed As Single
  466.  
  467.     lblPolygons.Caption = ""
  468.     lblTime.Caption = ""
  469.  
  470.     ' Create the data.
  471.     CreateData
  472.     If Objects.Count < 1 Then Exit Sub
  473.  
  474.     ' Focus on the origin.
  475.     FocusX = 0#
  476.     FocusY = 0#
  477.     FocusZ = 0#
  478.  
  479.     ' Create a background color.
  480.     BackR = 0
  481.     BackG = 0
  482.     BackB = 0
  483.  
  484.     ' Fill with another color so we can see progress.
  485.     pic.Line (pic.ScaleLeft, pic.ScaleTop)- _
  486.         Step(pic.ScaleWidth, pic.ScaleHeight), _
  487.         RGB(0, 0, &H80), BF
  488.  
  489.     ' Display the data.
  490.     start_time = Timer
  491.     Select Case RenderingMethod
  492.         Case render_WireFrame
  493.             RenderWireFrame pic
  494.         Case render_BackfacesRemoved
  495.             RenderBackfacesRemoved pic
  496.         Case render_HiddenSurfacesRemoved
  497.             RenderHiddenSurfacesRemoved pic, lblPolygons
  498.         Case render_Shaded
  499.             RenderShaded pic, lblPolygons
  500.         Case render_RayTracing
  501.             RenderRayTracing pic, CInt(txtStep.Text), CInt(txtDepth.Text)
  502.     End Select
  503.     ellapsed = Timer - start_time
  504.     lblTime.Caption = Format$(ellapsed \ 60) & _
  505.         ":" & Format$(ellapsed Mod 60, "00")
  506. End Sub
  507. ' Make the common dialog control's file name have the
  508. ' indicated extension.
  509. Private Sub SetDialogExtension(ByVal dlg As Control, ByVal extension As String)
  510. Dim pos As Integer
  511.  
  512.     pos = InStrRev(dlg.FileName, ".")
  513.     If pos > 0 Then
  514.         dlg.FileName = Left$(dlg.FileName, pos) & extension
  515.     End If
  516. End Sub
  517.  
  518. ' Render the objects.
  519. Private Sub cmdRender_Click()
  520.     If Running Then
  521.         Running = False
  522.         cmdRender.Caption = "Stopped"
  523.         cmdRender.Enabled = False
  524.         DoEvents
  525.     Else
  526.         Running = True
  527.         cmdRender.Caption = "Stop"
  528.         MousePointer = vbHourglass
  529.         DoEvents
  530.  
  531.         ' Render the objects.
  532.         RenderObjects picCanvas, lblPolygons
  533.  
  534.         MousePointer = vbDefault
  535.         cmdRender.Enabled = True
  536.         cmdRender.Caption = "Render"
  537.         Running = False
  538.         Beep
  539.     End If
  540. End Sub
  541.  
  542. Private Sub Form_Load()
  543.     dlgFile.InitDir = App.Path
  544.  
  545.     optMethod(0).value = True
  546. End Sub
  547.  
  548. Private Sub Form_Resize()
  549. Dim hgt As Single
  550.  
  551. #If False Then
  552. Dim wid As Single
  553.     wid = ScaleWidth - picCanvas.Left
  554.     If wid < 120 Then wid = 120
  555.     picCanvas.Width = wid
  556.     picCanvas.Height = ScaleHeight
  557. #End If
  558.  
  559.     hgt = ScaleHeight - txtObjects.Top
  560.     If hgt < 120 Then hgt = 120
  561.     txtObjects.Height = hgt
  562. End Sub
  563.  
  564.  
  565. ' Halt immediately in case we're in the middle of
  566. ' ray tracing.
  567. Private Sub Form_Unload(Cancel As Integer)
  568.     End
  569. End Sub
  570.  
  571. Private Sub mnuFileNew_Click()
  572.     txtObjects.Text = ""
  573. End Sub
  574.  
  575. Private Sub mnuFileSaveBitmap_Click()
  576.     ' Allow the user to pick a file.
  577.     On Error Resume Next
  578.     dlgFile.Filter = "Bitmaps (*.bmp)|*.bmp|" & _
  579.         "All Files (*.*)|*.*"
  580.     dlgFile.Flags = cdlOFNOverwritePrompt + cdlOFNHideReadOnly
  581.     SetDialogExtension dlgFile, "bmp"
  582.     dlgFile.ShowSave
  583.     If Err.Number = cdlCancel Then
  584.         Unload dlgFile
  585.         Exit Sub
  586.     ElseIf Err.Number <> 0 Then
  587.         Unload dlgFile
  588.         Beep
  589.         MsgBox "Error selecting file.", , vbExclamation
  590.         Exit Sub
  591.     End If
  592.     On Error GoTo 0
  593.  
  594.     SavePicture picCanvas.Image, dlgFile.FileName
  595. End Sub
  596. Private Sub mnuFileOpenScene_Click()
  597. Dim fnum As Integer
  598. Dim file_name As String
  599.  
  600.     ' Allow the user to pick a file.
  601.     On Error Resume Next
  602.     dlgFile.Filter = "Ray Scenes (*.ray)|*.ray|" & _
  603.         "All Files (*.*)|*.*"
  604.     dlgFile.Flags = cdlOFNFileMustExist + cdlOFNHideReadOnly
  605.     SetDialogExtension dlgFile, "ray"
  606.     dlgFile.ShowOpen
  607.     If Err.Number = cdlCancel Then
  608.         Unload dlgFile
  609.         Exit Sub
  610.     ElseIf Err.Number <> 0 Then
  611.         Unload dlgFile
  612.         Beep
  613.         MsgBox "Error selecting file.", , vbExclamation
  614.         Exit Sub
  615.     End If
  616.     On Error GoTo 0
  617.  
  618.     file_name = Trim$(dlgFile.FileName)
  619.     dlgFile.InitDir = Left$(file_name, Len(file_name) _
  620.         - Len(dlgFile.FileTitle) - 1)
  621.  
  622.     fnum = FreeFile
  623.     Open file_name For Input As fnum
  624.     txtObjects.Text = Input$(LOF(fnum), fnum)
  625.     Caption = "VBRay [" & dlgFile.FileTitle & "]"
  626.     Close fnum
  627. End Sub
  628. Private Sub mnuFileSaveScene_Click()
  629. Dim fnum As Integer
  630. Dim file_name As String
  631.  
  632.     ' Allow the user to pick a file.
  633.     On Error Resume Next
  634.     dlgFile.Filter = "Ray Scenes (*.ray)|*.ray|" & _
  635.         "All Files (*.*)|*.*"
  636.     dlgFile.Flags = cdlOFNOverwritePrompt + cdlOFNHideReadOnly
  637.     SetDialogExtension dlgFile, "ray"
  638.     dlgFile.ShowSave
  639.     If Err.Number = cdlCancel Then
  640.         Unload dlgFile
  641.         Exit Sub
  642.     ElseIf Err.Number <> 0 Then
  643.         Unload dlgFile
  644.         Beep
  645.         MsgBox "Error selecting file.", , vbExclamation
  646.         Exit Sub
  647.     End If
  648.     On Error GoTo 0
  649.  
  650.     file_name = Trim$(dlgFile.FileName)
  651.     dlgFile.InitDir = Left$(file_name, Len(file_name) _
  652.         - Len(dlgFile.FileTitle) - 1)
  653.  
  654.     fnum = FreeFile
  655.     Open file_name For Output As fnum
  656.     Print #fnum, txtObjects.Text
  657.     Close fnum
  658.     Caption = "VBRay [" & dlgFile.FileTitle & "]"
  659. End Sub
  660.  
  661. ' Add an ambient light entry to the object list.
  662. Private Sub mnuObjAmbientLight_Click()
  663.     txtObjects.Text = txtObjects.Text & _
  664.         "AmbientLight( Ir, Ig, Ib )" & vbCrLf
  665.     txtObjects.SelStart = Len(txtObjects.Text)
  666. End Sub
  667.  
  668. Private Sub mnuObjBumpyShere_Click()
  669.     txtObjects.Text = txtObjects.Text & _
  670.         "BumpySphere( Radius, X, Y, Z," & vbCrLf & _
  671.         "  bumpiness,        ' Bumpiness " & vbCrLf & _
  672.         "  ka_r, ka_g, ka_b, ' Ambient" & vbCrLf & _
  673.         "  kd_r, kd_g, kd_b, ' Diffuse" & vbCrLf & _
  674.         "  spec_n, spec_s,   ' Specular" & vbCrLf & _
  675.         "  kr_r, kr_g, kr_b, ' Reflected" & vbCrLf & _
  676.         "  kt_n, n1, n2,     ' TransN, n1, n2" & vbCrLf & _
  677.         "  kt_r, kt_g, kt_b  ' Transmitted" & vbCrLf & _
  678.         ")" & vbCrLf
  679.     txtObjects.SelStart = Len(txtObjects.Text)
  680. End Sub
  681.  
  682. Private Sub mnuObjCheckerboard_Click()
  683.     txtObjects.Text = txtObjects.Text & _
  684.         "Checkerboard(" & vbCrLf & _
  685.         "  num_squares_1,    ' # squares in 1st direction" & vbCrLf & _
  686.         "  num_squares_2,    ' # squares in 2nd direction" & vbCrLf & _
  687.         "  x1, y1, z1,       ' Point in corner" & vbCrLf & _
  688.         "  x2, y2, z2,       ' Point in 1st corner of square" & vbCrLf & _
  689.         "  x3, y3, z3,       ' Point in 2nd corner of square" & vbCrLf & _
  690.         "  ka_r, ka_g, ka_b, ' Ambient" & vbCrLf & _
  691.         "  kd_r, kd_g, kd_b, ' Diffuse" & vbCrLf & _
  692.         "  spec_n, spec_s,   ' Specular" & vbCrLf & _
  693.         "  kr_r, kr_g, kr_b, ' Reflected" & vbCrLf & _
  694.         "  kt_n, n1, n2,     ' TransN, n1, n2" & vbCrLf & _
  695.         "  kt_r, kt_g, kt_b  ' Transmitted" & vbCrLf & _
  696.         ")" & vbCrLf
  697.     txtObjects.SelStart = Len(txtObjects.Text)
  698. End Sub
  699. Private Sub mnuObjCylinder_Click()
  700.     txtObjects.Text = txtObjects.Text & _
  701.         "Cylinder(radius,    ' Radius" & vbCrLf & _
  702.         "  p1x, p1y, p1z,    ' Point at one end" & vbCrLf & _
  703.         "  p2x, p2y, p2z,    ' Point at other end" & vbCrLf & _
  704.         "  ka_r, ka_g, ka_b, ' Ambient" & vbCrLf & _
  705.         "  kd_r, kd_g, kd_b, ' Diffuse" & vbCrLf & _
  706.         "  spec_n, spec_s,   ' Specular" & vbCrLf & _
  707.         "  kr_r, kr_g, kr_b, ' Reflected" & vbCrLf & _
  708.         "  kt_n, n1, n2,     ' TransN, n1, n2" & vbCrLf & _
  709.         "  kt_r, kt_g, kt_b  ' Transmitted" & vbCrLf & _
  710.         ")" & vbCrLf
  711.     txtObjects.SelStart = Len(txtObjects.Text)
  712. End Sub
  713.  
  714. Private Sub mnuObjDisk_Click()
  715.     txtObjects.Text = txtObjects.Text & _
  716.         "Disk(radius,        ' Radius" & vbCrLf & _
  717.         "  x, y, z,          ' Point on plane" & vbCrLf & _
  718.         "  Nx, Ny, Nz,       ' Normal vector" & vbCrLf & _
  719.         "  ka_r, ka_g, ka_b, ' Ambient" & vbCrLf & _
  720.         "  kd_r, kd_g, kd_b, ' Diffuse" & vbCrLf & _
  721.         "  spec_n, spec_s,   ' Specular" & vbCrLf & _
  722.         "  kr_r, kr_g, kr_b, ' Reflected" & vbCrLf & _
  723.         "  kt_n, n1, n2,     ' TransN, n1, n2" & vbCrLf & _
  724.         "  kt_r, kt_g, kt_b  ' Transmitted" & vbCrLf & _
  725.         ")" & vbCrLf
  726.     txtObjects.SelStart = Len(txtObjects.Text)
  727. End Sub
  728.  
  729. Private Sub mnuObjFace_Click()
  730.     txtObjects.Text = txtObjects.Text & _
  731.         "Face(num_points,    ' Number of points" & vbCrLf & _
  732.         "  x1, y1, z1,       ' Point 1" & vbCrLf & _
  733.         "  x2, y2, z2,       ' Point 2" & vbCrLf & _
  734.         "  ...,              ' Other points" & vbCrLf & _
  735.         "  ka_r, ka_g, ka_b, ' Ambient" & vbCrLf & _
  736.         "  kd_r, kd_g, kd_b, ' Diffuse" & vbCrLf & _
  737.         "  spec_n, spec_s,   ' Specular" & vbCrLf & _
  738.         "  kr_r, kr_g, kr_b, ' Reflected" & vbCrLf & _
  739.         "  kt_n, n1, n2,     ' TransN, n1, n2" & vbCrLf & _
  740.         "  kt_r, kt_g, kt_b  ' Transmitted" & vbCrLf & _
  741.         ")" & vbCrLf
  742.     txtObjects.SelStart = Len(txtObjects.Text)
  743. End Sub
  744.  
  745. Private Sub mnuObjHoledCheckerboard_Click()
  746. Dim file_name As String
  747.  
  748.     file_name = App.Path
  749.     If Right$(file_name, 1) <> "\" Then file_name = file_name & "\"
  750.     file_name = file_name & "filename.bmp"
  751.  
  752.     txtObjects.Text = txtObjects.Text & _
  753.         "HoledCheckerboard(" & vbCrLf & _
  754.         "  ' The texture file name (absolute or relative)" & vbCrLf & _
  755.         "  " & file_name & "," & vbCrLf & _
  756.         "  num_squares_1,    ' # squares in 1st direction" & vbCrLf & _
  757.         "  num_squares_2,    ' # squares in 2nd direction" & vbCrLf & _
  758.         "  x1, y1, z1,       ' Point in corner" & vbCrLf & _
  759.         "  x2, y2, z2,       ' Point in 1st corner of square" & vbCrLf & _
  760.         "  x3, y3, z3,       ' Point in 2nd corner of square" & vbCrLf & _
  761.         "  ambient_factor,   ' Scale factor for ambient values" & vbCrLf & _
  762.         "  diffuse_factor,   ' Scale factor for diffuse values" & vbCrLf & _
  763.         "  spec_n, spec_s,   ' Specular" & vbCrLf & _
  764.         "  kr_r, kr_g, kr_b, ' Reflected" & vbCrLf & _
  765.         "  kt_n, n1, n2,     ' TransN, n1, n2" & vbCrLf & _
  766.         "  kt_r, kt_g, kt_b  ' Transmitted" & vbCrLf & _
  767.         ")" & vbCrLf
  768.     txtObjects.SelStart = Len(txtObjects.Text)
  769. End Sub
  770.  
  771. ' Add a light source to the object list.
  772. Private Sub mnuObjLightSource_Click()
  773.     txtObjects.Text = txtObjects.Text & _
  774.         "LightSource( X, Y, Z," & vbCrLf & _
  775.         "  Ir, Ig, Ib )" & vbCrLf
  776.     txtObjects.SelStart = Len(txtObjects.Text)
  777. End Sub
  778.  
  779. ' Add a plane to the object list.
  780. Private Sub mnuObjPlane_Click()
  781.     txtObjects.Text = txtObjects.Text & _
  782.         "Plane( x, y, z,     ' Point on plane" & vbCrLf & _
  783.         "  Nx, Ny, Nz,       ' Normal vector" & vbCrLf & _
  784.         "  ka_r, ka_g, ka_b, ' Ambient" & vbCrLf & _
  785.         "  kd_r, kd_g, kd_b, ' Diffuse" & vbCrLf & _
  786.         "  spec_n, spec_s,   ' Specular" & vbCrLf & _
  787.         "  kr_r, kr_g, kr_b, ' Reflected" & vbCrLf & _
  788.         "  kt_n, n1, n2,     ' TransN, n1, n2" & vbCrLf & _
  789.         "  kt_r, kt_g, kt_b  ' Transmitted" & vbCrLf & _
  790.         ")" & vbCrLf
  791.     txtObjects.SelStart = Len(txtObjects.Text)
  792. End Sub
  793.  
  794. Private Sub mnuObjPolygon_Click()
  795.     txtObjects.Text = txtObjects.Text & _
  796.         "Polygon(num_points, ' Number of points" & vbCrLf & _
  797.         "  x1, y1, z1,       ' Point 1" & vbCrLf & _
  798.         "  x2, y2, z2,       ' Point 2" & vbCrLf & _
  799.         "  ...,              ' Other points" & vbCrLf & _
  800.         "  ka_r, ka_g, ka_b, ' Ambient" & vbCrLf & _
  801.         "  kd_r, kd_g, kd_b, ' Diffuse" & vbCrLf & _
  802.         "  spec_n, spec_s,   ' Specular" & vbCrLf & _
  803.         "  kr_r, kr_g, kr_b, ' Reflected" & vbCrLf & _
  804.         "  kt_n, n1, n2,     ' TransN, n1, n2" & vbCrLf & _
  805.         "  kt_r, kt_g, kt_b  ' Transmitted" & vbCrLf & _
  806.         ")" & vbCrLf
  807.     txtObjects.SelStart = Len(txtObjects.Text)
  808. End Sub
  809.  
  810. ' Add a sphere to the object list.
  811. Private Sub mnuObjSphere_Click()
  812.     txtObjects.Text = txtObjects.Text & _
  813.         "Sphere( Radius, X, Y, Z," & vbCrLf & _
  814.         "  ka_r, ka_g, ka_b, ' Ambient" & vbCrLf & _
  815.         "  kd_r, kd_g, kd_b, ' Diffuse" & vbCrLf & _
  816.         "  spec_n, spec_s,   ' Specular" & vbCrLf & _
  817.         "  kr_r, kr_g, kr_b, ' Reflected" & vbCrLf & _
  818.         "  kt_n, n1, n2,     ' TransN, n1, n2" & vbCrLf & _
  819.         "  kt_r, kt_g, kt_b  ' Transmitted" & vbCrLf & _
  820.         ")" & vbCrLf
  821.     txtObjects.SelStart = Len(txtObjects.Text)
  822. End Sub
  823.  
  824. Private Sub mnuObjMappedCheckerboard_Click()
  825. Dim file_name As String
  826.  
  827.     file_name = App.Path
  828.     If Right$(file_name, 1) <> "\" Then file_name = file_name & "\"
  829.     file_name = file_name & "filename.bmp"
  830.  
  831.     txtObjects.Text = txtObjects.Text & _
  832.         "MappedCheckerboard(" & vbCrLf & _
  833.         "  ' The texture file name (absolute or relative)" & vbCrLf & _
  834.         "  " & file_name & "," & vbCrLf & _
  835.         "  num_squares_1,    ' # squares in 1st direction" & vbCrLf & _
  836.         "  num_squares_2,    ' # squares in 2nd direction" & vbCrLf & _
  837.         "  x1, y1, z1,       ' Point in corner" & vbCrLf & _
  838.         "  x2, y2, z2,       ' Point in 1st corner of square" & vbCrLf & _
  839.         "  x3, y3, z3,       ' Point in 2nd corner of square" & vbCrLf & _
  840.         "  ambient_factor,   ' Scale factor for ambient values" & vbCrLf & _
  841.         "  diffuse_factor,   ' Scale factor for diffuse values" & vbCrLf & _
  842.         "  spec_n, spec_s,   ' Specular" & vbCrLf & _
  843.         "  kr_r, kr_g, kr_b, ' Reflected" & vbCrLf & _
  844.         "  kt_n, n1, n2,     ' TransN, n1, n2" & vbCrLf & _
  845.         "  kt_r, kt_g, kt_b  ' Transmitted" & vbCrLf & _
  846.         ")" & vbCrLf
  847.     txtObjects.SelStart = Len(txtObjects.Text)
  848. End Sub
  849.  
  850. ' Add a viewpoint entry to the object list.
  851. Private Sub mnuObjViewpoint_Click()
  852.     txtObjects.Text = txtObjects.Text & _
  853.         "Viewpoint( X, Y, Z )" & vbCrLf
  854.     txtObjects.SelStart = Len(txtObjects.Text)
  855. End Sub
  856. Private Sub mnuRenderRender_Click()
  857.     cmdRender_Click
  858. End Sub
  859.  
  860.  
  861. Private Sub optMethod_Click(Index As Integer)
  862.     RenderingMethod = Index
  863. End Sub
  864.  
  865. ' Print the coordinates of the point clicked.
  866. ' This is useful for debugging.
  867. Private Sub picCanvas_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  868.     Debug.Print "(" & Format$(X) & ", " & Format$(Y) & ")"
  869. End Sub
  870.